/*jshint node:true*/
module.exports = function (grunt) {

    "use strict";

    var banner,
        umdStart,
        umdMiddle,
        umdEnd,
        umdStandardDefine,
        umdAdditionalDefine,
        umdLocalizationDefine;

    banner = "/*!\n" +
        " * jQuery Validation Plugin v<%= pkg.version %>\n" +
        " *\n" +
        " * <%= pkg.homepage %>\n" +
        " *\n" +
        " * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>\n" +
        " * Released under the <%= _.map(pkg.licenses, 'type').join(', ') %> license\n" +
        " */\n";

// Define UMD wrapper variables

    umdStart = "(function( factory ) {\n" +
        "\tif ( typeof define === \"function\" && define.amd ) {\n";

    umdMiddle = "\t} else if (typeof module === \"object\" && module.exports) {\n" +
        "\t\tmodule.exports = factory( require( \"jquery\" ) );\n" +
        "\t} else {\n" +
        "\t\tfactory( jQuery );\n" +
        "\t}\n" +
        "}(function( $ ) {\n\n";

    umdEnd = "return $;" +
        "\n}));";

    umdStandardDefine = "\t\tdefine( [\"jquery\"], factory );\n";
    umdAdditionalDefine = "\t\tdefine( [\"jquery\", \"./jquery.validate\"], factory );\n";
    umdLocalizationDefine = "\t\tdefine( [\"jquery\", \"../jquery.validate\"], factory );\n";

    grunt.initConfig({
        pkg: grunt.file.readJSON("package.json"),
        concat: {

            // Used to copy to dist folder
            dist: {
                options: {
                    banner: banner +
                    umdStart +
                    umdStandardDefine +
                    umdMiddle,
                    footer: umdEnd
                },
                files: {
                    "dist/jquery.validate.js": ["src/core.js", "src/*.js"]
                }
            },
            extra: {
                options: {
                    banner: banner +
                    umdStart +
                    umdAdditionalDefine +
                    umdMiddle,
                    footer: umdEnd
                },
                files: {
                    "dist/additional-methods.js": ["src/additional/additional.js", "src/additional/*.js"]
                }
            }
        },
        uglify: {
            options: {
                preserveComments: false,
                banner: "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " +
                "<%= grunt.template.today('m/d/yyyy') %>\n" +
                " * <%= pkg.homepage %>\n" +
                " * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" +
                " Licensed <%= _.map(pkg.licenses, 'type').join(', ') %> */\n"
            },
            dist: {
                files: {
                    "dist/additional-methods.min.js": "dist/additional-methods.js",
                    "dist/jquery.validate.min.js": "dist/jquery.validate.js"
                }
            },
            all: {
                expand: true,
                cwd: "dist/localization",
                src: "**/*.js",
                dest: "dist/localization",
                ext: ".min.js"
            }
        },
        compress: {
            dist: {
                options: {
                    mode: "zip",
                    level: 1,
                    archive: "dist/<%= pkg.name %>-<%= pkg.version %>.zip",
                    pretty: true
                },
                src: [
                    "changelog.txt",
                    "demo/**/*.*",
                    "dist/**/*.js",
                    "Gruntfile.js",
                    "lib/**/*.*",
                    "package.json",
                    "README.md",
                    "src/**/*.*",
                    "test/**/*.*"
                ]
            }
        },
        qunit: {
            files: "test/index.html"
        },
        jshint: {
            options: {
                jshintrc: true
            },
            core: {
                src: "src/**/*.js"
            },
            test: {
                src: ["test/*.js", "test/additional/*.js"]
            },
            grunt: {
                src: "Gruntfile.js"
            }
        },
        watch: {
            options: {
                atBegin: true
            },
            src: {
                files: "<%= jshint.core.src %>",
                tasks: [
                    "concat"
                ]
            }
        },
        jscs: {
            all: ["<%= jshint.core.src %>", "<%= jshint.test.src %>", "<%= jshint.grunt.src %>"]
        },
        copy: {
            dist: {
                options: {

                    // Append UMD wrapper
                    process: function (content) {
                        return umdStart + umdLocalizationDefine + umdMiddle + content + umdEnd;
                    }
                },
                src: "src/localization/*",
                dest: "dist/localization",
                expand: true,
                flatten: true,
                filter: "isFile"
            }
        },
        replace: {
            dist: {
                src: "dist/**/*.min.js",
                overwrite: true,
                replacements: [
                    {
                        from: "./jquery.validate",
                        to: "./jquery.validate.min"
                    }
                ]
            }
        }
    });

    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-qunit");
    grunt.loadNpmTasks("grunt-contrib-uglify");
    grunt.loadNpmTasks("grunt-contrib-concat");
    grunt.loadNpmTasks("grunt-contrib-compress");
    grunt.loadNpmTasks("grunt-contrib-watch");
    grunt.loadNpmTasks("grunt-jscs");
    grunt.loadNpmTasks("grunt-contrib-copy");
    grunt.loadNpmTasks("grunt-text-replace");

    grunt.registerTask("default", ["concat", "copy", "jscs", "jshint", "qunit"]);
    grunt.registerTask("release", ["default", "uglify", "replace", "compress"]);
    grunt.registerTask("start", ["concat", "watch"]);

};
